<?php
// 编码声明
header("Content-Type:text/html;charset=utf-8");

/**
 * 消息提醒
 * @param string $msg 提醒的内容
 * @param string $url 跳转的地址，如果没给，就默认返回上一页
 * @return void
 */
function notice($msg = '', $url = '')
{
    if(empty($url)) //没有跳转地址 返回上一个界面
    {
        echo "<script>alert('$msg');history.go(-1);</script>";
    }else //有地址，就跳转到指定的地址去
    {
        echo "<script>alert('$msg');location.href='$url';</script>";
    }
}

/**
 * 文件上传
 * @param string $input 表单中input[file]name名字
 * @param string $path 文件保存的路径 
 * @return array [result=>true|false, msg=>'上传成功或失败的原因']
 */
function UploadFile($input = 'file', $path = '')
{
    //定义一个返回值
    $success = ['result' => false, 'msg' => '', 'data' => ''];

    //获取文件对象
    $file = $_FILES[$input];

    //判断是否有上传出错
    if($file['error'] > 0)
    {
        switch($file['error'])
        {
            case 1:
                $success['msg'] = '文件上传大小超过了服务器的限制';
                break;
            case 2:
                $success['msg'] = '文件上传超过了表单大小的限制';
                break;
            case 3:
                $success['msg'] = '网络中断';
                break;
            case 4:
                $success['msg'] = '无文件上传';
                break;
            default:
                $success['msg'] = '未知错误';
        }

        return $success;
    }

    //给文件重新起名字
    $ext = pathinfo($file['name'], PATHINFO_EXTENSION);

    //文件名
    $name = pathinfo($file['name'], PATHINFO_FILENAME);

    //新的文件名格式：文件名_时间戳_随机数字.jpg
    $time = time();
    $rand = mt_rand(1111, 9999);
    $filename = "{$name}_{$time}_{$rand}.$ext";

    //如果目录不存在，就直接失败
    if(!is_dir($path))
    {
        $success['msg'] = '保存目录不存在';
        return $success;
    }

    //拼接路径
    $filename = $path.'/'.$filename;

    //判断文件是否通过http post上传
    if(!is_uploaded_file($file['tmp_name']))
    {
        $success['msg'] = '文件上传方式不合法';
        return $success;
    }
    
    //移动文件 临时目录的文件  移动到 我们制定的目录中
    if(move_uploaded_file($file['tmp_name'], $filename))
    {
        $success['result'] = true;
        $success['msg'] = '文件上传成功';
        $success['data'] = $filename;
    }else
    {
        $success['msg'] = '文件上传失败';
    }

    return $success;
}



if (!function_exists('randstr')) {
    /**
     * 获得随机字符串
     * @param $len             需要的长度
     * @param $special        是否需要特殊符号
     * @return string       返回随机字符串
     */
    function randstr($len = 10, $special = false)
    {
        $chars = array(
            "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
            "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
            "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
            "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
            "3", "4", "5", "6", "7", "8", "9"
        );

        if ($special) {
            $chars = array_merge($chars, array(
                "!", "@", "#", "$", "?", "|", "{", "/", ":", ";",
                "%", "^", "&", "*", "(", ")", "-", "_", "[", "]",
                "}", "<", ">", "~", "+", "=", ",", "."
            ));
        }

        $charsLen = count($chars) - 1;
        shuffle($chars);                            //打乱数组顺序
        $str = '';
        for ($i = 0; $i < $len; $i++) {
            $str .= $chars[mt_rand(0, $charsLen)];    //随机取出一位
        }
        return $str;
    }
}


/* 
*   获取当前的网址   
*/

function get_url()
{
    // 获取当前的完整地址
    $str = $_SERVER['PHP_SELF'] . '?';

    if($_GET){
        foreach($_GET as $k => $v){
            if($k != 'page'){
                $str.= $k.'='.$v.'&';
            }
        }
    }

    return $str;
}

/**
 * 输出分页函数
 * @param $current 当前页
 * @param $count   记录总数(查询数据表的总数)
 * @param $limit   每页显示多少条
 * @param $size    显示页码
 * @param $class   样式
 */
function page($current, $count, $limit, $size, $class = 'digg')
{
    $page = '';

    // 判断是否显示分页
    if ($count > $limit) {
        // 总分页
        $pages = ceil($count / $limit);

        // 获取地址
        $url = get_url();

        $page .= '<div class="' . $class . '">';

        // 首页 上一页
        if ($current == 1) {
            $page .= '<span class="disabled">首&nbsp;页</span>';
            $page .= '<span class="disabled">上一页</span>';
        } else {
            $page .= '<a href="' . $url . 'page=1">首&nbsp;页</a>';
            $page .= '<a href="' . $url . 'page=' . ($current - 1) . '">上一页</a>';
        }

        // 中间部分显示页码，  取的页码范围
        if ($current <= floor($size / 2)) {
            // 当前页在中间位置靠左,floor()向下取整
            $start  =  1;
            // 如果总页数大于中间显示多少页,结束数字就是中间显示多少页的数字,否则结束数字就是总页数
            $end = $pages < $size ? $pages : $size;
        } else if ($current >= $pages - floor($size / 2)) {
            // 当前页在中间位置靠右 避免页数出现0或者负数
            $start = $pages - $size + 1 <= 0 ? 1 : $pages - $size + 1;
            $end = $pages;
        } else {
            // 当前页刚好在中间位置
            $start = $current - floor($size / 2);
            $end = $current + floor($size / 2);
        }

        for ($i = $start; $i <= $end; $i++) {
            if ($i == $current) {
                $page .= '<span class="current">' . $i . '</span>';
            } else {
                $page .= '<a href="' . $url . 'page=' . $i . '">' . $i . '</a>';
            }
        }

        // 下一页 尾页
        if ($pages == $current) {
            $page .= '<span class="disabled">下一页</span>';
            $page .= '<span class="disabled">尾&nbsp;页</span>';
        } else {
            $page .= '<a href="' . $url . 'page=' . ($current + 1) . '">下一页</a>';
            $page .= '<a href="' . $url . 'page=' . $pages . '">尾&nbsp;页</a>';
        }

        $page .= '</div>';
    }

    return $page;
}


/**
 * 自动获取当前所在的地区
 * @return string 返回当前的城市信息
 */
function GetLocation()
{
    global $link;
    global $pre_;
    //获取接口的返回值
    $api = file_get_contents("http://ip-api.com/json/");

    if(empty($api))
    {
        return '';
    }

    //将json转换为 php数组
    $info = json_decode($api, true);

    $city = isset($info['city']) ? trim($info['city']) : '';

    if(empty($city))
    {
        return '';
    }

    //组装sql语句，查询城市信息
    $sql = "SELECT name,province FROM {$pre_}region WHERE pinyin = '$city'";
    $region = find($sql);
    
    return $region;
}


/**
 * 查询天气信息
 * @param string $city 城市名称
 * @return string 天气情况
 */
function GetWeather($city)
{
    //请求天气接口
    $json = file_get_contents("https://api.asilu.com/weather/?city=$city");

    //将json信息转换为php数组
    $result = json_decode($json, true);

    //获取日期
    $date = isset($result['date']) ? trim($result['date']) : date("m-d", time());

    $weather = isset($result['weather'][0]) ? $result['weather'][0] : [];

    if(empty($weather))
    {
        return '暂无天气情况';
    }

    $wea = isset($weather['weather']) ? trim($weather['weather']) : '';
    $temp = isset($weather['temp']) ? trim($weather['temp']) : '';
    $wind = isset($weather['wind']) ? trim($weather['wind']) : '';
    
    $html = "$date 温度：$temp 天气情况：$wea $wind";

    //设置cookie 保存天气情况
    setcookie('weather', $html, time() + 3600);
    
    return $html;
}





//--------------------------数据库操作----------------------------//
/**
 * 单条数据查询
 * @param string $sql sql语句
 * @return array 一位数组是单条数据的结果
 */
function find($sql = '')
{
    global $link;

    //执行
    $res = mysqli_query($link, $sql);

    //执行失败
    if(!$res)
    {
        echo "【SQL语句有误】：".mysqli_error($link);
        exit;
    }

    //返回查询的数据
    return mysqli_fetch_assoc($res);
}

/**
 * 全部数据查询
 * @param string $sql sql语句
 * @return array 二维数组
 */
function all($sql)
{
    //全局变量
    global $link;

    //执行sql语句
    $res = mysqli_query($link, $sql);

    //执行失败
    if(!$res)
    {
        echo "【SQL语句有误】：".mysqli_error($link);
        exit;
    }

    //返回数据
    // mysqli_fetch_assoc($res); //一次只拿一条数据，如果拿到没有数据了就返回false
    $data = [];

    while($row = mysqli_fetch_assoc($res)) // $row 一位数组
    {
        $data[] = $row; // 一位数组又放到一个一位数组中
    }

    return $data;
}


/**
 * 插入数据方法
 * @param string $table 表名
 * @param array $data 数据
 * @return int 返回插入的自增ID
 */
function add($table, $data = [])
{
    global $link;
    global $pre_;

    //拼接一个完整的表名
    $table = $pre_.$table;

    //SQL
    // INSERT INTO 表名(`字段1`,`字段2`,`字段3`)VALUES('值1','值2','值3')

    $keys = "`".implode("`,`" ,array_keys($data))."`";
    $values = "'".implode("','", $data)."'";
    //抽离出数组中所有key(索引) 成立一个新数组
    // var_dump(array_keys($data));

    //组装sql
    $sql = "INSERT INTO $table($keys)VALUES($values)";

    // 调试语句
    // echo $sql;
    // exit;

    //执行sql语句
    $res = mysqli_query($link, $sql);

    //执行失败
    if(!$res)
    {
        echo "【SQL语句有误】：".mysqli_error($link);
        exit;
    }

    //返回成功的结果 自增ID
    return mysqli_insert_id($link);
}

/**
 * 
 * @param string $table 表名
 * @param array $data 修改的数据
 * @param string $where 条件
 * @return int 返回的是修改后的影响行数 mysqli_affected_rows
 */
function edit($table, $data = [], $where = 1)
{
    global $link;
    global $pre_;

    //组装完整表名
    $table = $pre_.$table;

    //SQL结构
    // UPDATE 表名 SET `字段1`='值1',`字段2`=`值2` WHERE 条件
    $str = "";
    foreach($data as $key=>$value)
    {
        $str .= "`$key` = '$value',";
    }

    $str = trim($str, ',');

    $sql = "UPDATE $table SET $str WHERE $where";

    //执行sql语句
    $res = mysqli_query($link, $sql);

    //执行失败
    if(!$res)
    {
        echo "【SQL语句有误】：".mysqli_error($link);
        exit;
    }

    //返回修改的影响行数
    return mysqli_affected_rows($link);
}

/**
 * 
 * @param string $table 表名
 * @param string $where 条件
 * @return int 返回的是删除的影响行数 mysql_affected_rows
 */
function del($table, $where = 1)
{
    global $link;
    global $pre_;

    //拼接完整表名
    $table = $pre_.$table;

    //组装SQL语句
    // DELETE FROM 表名 WHERE 条件
    $sql = "DELETE FROM $table WHERE $where";

    //执行sql语句
    $res = mysqli_query($link, $sql);

    //执行失败
    if(!$res)
    {
        echo "【SQL语句有误】：".mysqli_error($link);
        exit;
    }

    //删除成功返回影响行数
    return mysqli_affected_rows($link);
}